#include <arpa/inet.h>
#include <memory.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>

#include <iostream>
#include <string>
#include <vector>

class UDP {
 public:
  UDP(std::string target_addr = "", int target_port = 8000,
      size_t buffer_size = 1024);
  ~UDP();

  int bindServer(std::string &addr, int port);
  int reBindServer(std::string &addr, int port);

  void singleCast(std::vector<uint8_t> &buffer);
  void recvPacket(std::vector<uint8_t> &buffer);
  void changeTargetPort(int port);
  void changeTargetAddr(std::string &addr);

  int joinGroup(std::string &addr);
  void recvFromGroup(std::vector<uint8_t> &buffer);
  void groupCast();
  void quitGroup();

 private:
  in_addr_t target_addr_;
  int target_port_;
  size_t buffer_size_;
  bool in_group_;

  int sock_;
  sockaddr_in serv_, cli_;
  ip_mreq multi_;
};
